package com.eva.baidulibrary;

import android.content.Context;

import com.baidu.location.Address;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;

import java.util.List;

/**
 * 百度定位
 * 开发文档地址：http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
 *
 * @author GUXIA318
 * @date 2015-09-06 11:15
 */
public class BDLocationClient {

    private static BDLocationClient sInstance;
    private LocationClient mLocationClient;
    private BDLocationListener mListener;

    public static BDLocationClient getInstance() {
        if (sInstance == null) {
            sInstance = new BDLocationClient();
        }
        return sInstance;
    }

    /**
     * 定位请求，使用默认定位参数
     *
     * @param context
     */
    public void requestLocation(Context context, BDLocationListener listener) {
        requestLocation(context, null, listener);
    }

    /**
     * 定位请求，使用自定义定位参数
     *
     * @param context
     * @param option
     * @param listener
     */
    public void requestLocation(Context context, LocationClientOption option, BDLocationListener listener) {
        if (mLocationClient == null) {
            // 声明LocationClient类
            mLocationClient = new LocationClient(context.getApplicationContext());
        }

        // 注册监听函数
        this.mListener = listener;
        mLocationClient.registerLocationListener(mListener);

        // 设置定位参数
        if (option == null) {
            option = getDefaultOption();
        }
        mLocationClient.setLocOption(option);

        // 启动定位
        if (!mLocationClient.isStarted()) {
            mLocationClient.start();
        }

        mLocationClient.requestLocation();
    }

    /**
     * 关闭定位
     */
    public void stop() {
        if (mLocationClient != null) {
            mLocationClient.stop();
            mLocationClient = null;
        }
    }

    /**
     * 获取默认定位参数
     *
     */
    private LocationClientOption getDefaultOption() {
        // 配置定位SDK参数
        LocationClientOption option = new LocationClientOption();
        // 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        // 可选，默认gcj02，设置返回的定位结果坐标系
        option.setCoorType("bd09ll");
        // 可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
//            option.setScanSpan(0);
        // 可选，设置是否需要地址信息，默认不需要
        option.setIsNeedAddress(true);
        // 可选，默认false,设置是否使用gps
        option.setOpenGps(true);
        // 可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setLocationNotify(true);
        // 可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationDescribe(true);
        // 可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIsNeedLocationPoiList(true);
        // 可选，默认false，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认杀死
        option.setIgnoreKillProcess(false);
        // 可选，默认false，设置是否收集CRASH信息，默认收集
        option.SetIgnoreCacheException(false);
        // 可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        option.setEnableSimulateGps(false);
        return option;
    }

    // 实例监听器
    private BDLocationListener exampleListener = new BDLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            if (bdLocation != null) {
                String city = bdLocation.getCity(); // 城市
                double longitude = bdLocation.getLongitude(); // 经度
                double latitude = bdLocation.getLatitude(); // 维度
                Address address = bdLocation.getAddress(); // 地址详细信息，可以根据address获取国家、城市、街道等信息
                String addrStr = bdLocation.getAddrStr(); // 地址字符串
                String locationDescribe = bdLocation.getLocationDescribe(); // 位置语义化结果，需要option.setIsNeedLocationDescribe(true);
                int locType = bdLocation.getLocType(); // 定位方式，GPS、wifi、离线
                List<Poi> list = bdLocation.getPoiList(); // poi数据，需要option.setIsNeedLocationPoiList(true);
            }
        }
    };

}
